import exifread  # 导入exifread库，用于读取图片的EXIF信息
from datetime import datetime  # 导入datetime模块，用于处理日期和时间
from pathlib import Path
import re

# AlbumPath = Path(r"")
AlbumPath = Path(input("请输入相册路径："))


exif_time_format = "%Y:%m:%d %H:%M:%S"
out_time_format = "%Y%m%d_%H%M%S"
# extensions = ('.jpg', '.cr2')

for path in AlbumPath.glob("*.jpg"):
    # print(path.name)
    pattern = r'^IMG_\d{8}_\d{6}$'
    # 如果path.name的前19位不符合pattern
    if not re.match(pattern, path.name[:19]):
        print(f"{path.name} 不符合命名规范")
        # 以二进制模式打开图片文件
        with open(path, 'rb') as f:
            # 处理文件，提取EXIF信息
            date_taken = None
            try:
                tags = exifread.process_file(f)
                # 从EXIF信息中提取拍摄时间
                date_taken = tags['EXIF DateTimeOriginal'].values
                # 打印原始拍摄时间
                # print(date_taken)
            except Exception as e:
                # 如果EXIF信息中没有拍摄时间，则打印提示信息
                print(f"exif读取出错")

        if date_taken:
            # 将拍摄时间字符串转换为datetime对象
            dt = datetime.strptime(date_taken, exif_time_format)
            # 根据输出格式对时间进行格式化
            formatted_time = dt.strftime(out_time_format)
            # 打印格式化后的拍摄时间
            # print(formatted_time)

            # 构造新图片文件名
            new_name = "IMG_" + formatted_time + path.suffix

            # 如果新文件名与旧文件名不同且新文件名不存在，则重命名文件
            if new_name != path.name and not Path(path.parent / new_name).exists():
                try:
                    photos_folder = path.parent / "Photos"
                    photos_folder.mkdir(exist_ok=True)
                    path.rename(photos_folder / new_name)
                    print(f"重命名成功 {new_name}")
                except Exception as e:
                    print(f"重命名失败 ->{new_name}")

            else:
                print(f"新文件名 {new_name} 已存在")
                # 移动到重复文件夹
                repeat_folder = path.parent / "重复照片"
                repeat_folder.mkdir(exist_ok=True)
                path.rename(repeat_folder / path.name)
                print(f"{path.name} 移动到repeat文件夹")
        else:
            # 移动到noexif文件夹
            noexif_folder = path.parent / "noexif"
            noexif_folder.mkdir(exist_ok=True)
            try:
                # 如果noexif_folder / path.name不存在，则移动文件
                if not (noexif_folder / path.name).exists():
                    path.rename(noexif_folder / path.name)
                    print(f"{path.name} 移动到noexif文件夹")
                else:
                    print(f"{path.name} 文件已存在，移动失败")
                    # 如果大小相同，则删除文件
                    if path.stat().st_size == (noexif_folder / path.name).stat().st_size:
                        try:
                            path.unlink()
                        except Exception as e:
                            print("删除文件失败", e)
                        print("大小相同，删除文件")
            except FileNotFoundError:
                print(f"{path.name} 文件不存在，移动失败")
            except NotADirectoryError:
                print(f"{noexif_folder} 不是有效目录，移动失败")
            except PermissionError:
                print(f"权限不足，无法移动 {path.name} 到 {noexif_folder}")
            except OSError as e:
                print(f"移动文件时发生其他错误：{e}")

# 移动png文件
for png in AlbumPath.glob("*.png"):
    png_folder = png.parent / "png"
    png_folder.mkdir(exist_ok=True)
    png.rename(png_folder / png.name)
    print(f"{png.name} 移动到png文件夹")

# 移动mp4文件
for mp4 in AlbumPath.glob("*.mp4"):
    mp4_folder = mp4.parent / "mp4"
    mp4_folder.mkdir(exist_ok=True)
    mp4.rename(mp4_folder / mp4.name)
    print(f"{mp4.name} 移动到mp4文件夹")